package org.jin.jinaicode.utils;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import org.jin.jinaicode.model.entity.App;
import org.jin.jinaicode.model.entity.ChatHistory;
import org.jin.jinaicode.model.entity.User;
import org.jin.jinaicode.model.enums.ChatHistoryMessageTypeEnum;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;

/**
 * Markdown生成工具类
 *
 * @author 小堇
 */
public class MarkdownUtils {

    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    /**
     * 生成对话记录的Markdown文档
     *
     * @param app 应用信息
     * @param user 用户信息
     * @param chatHistoryList 对话记录列表
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return Markdown内容
     */
    public static String generateChatHistoryMarkdown(App app, User user, List<ChatHistory> chatHistoryList,
                                                   LocalDateTime startTime, LocalDateTime endTime) {
        StringBuilder markdown = new StringBuilder();

        // 1. 标题
        markdown.append("# 应用对话记录导出\n\n");

        // 2. 基本信息
        appendBasicInfo(markdown, app, user, chatHistoryList, startTime, endTime);

        // 3. 统计信息
        appendStatistics(markdown, chatHistoryList);

        // 4. 对话记录
        appendChatHistory(markdown, chatHistoryList);

        // 5. 页脚
        appendFooter(markdown);

        return markdown.toString();
    }

    /**
     * 添加基本信息
     */
    private static void appendBasicInfo(StringBuilder markdown, App app, User user, List<ChatHistory> chatHistoryList,
                                      LocalDateTime startTime, LocalDateTime endTime) {
        markdown.append("## 📊 基本信息\n\n");
        markdown.append("- **应用名称**: ").append(app.getAppName()).append("\n");
        markdown.append("- **应用ID**: ").append(app.getId()).append("\n");
        markdown.append("- **创建者**: ").append(user.getUserName()).append("\n");
        markdown.append("- **代码生成类型**: ").append(getCodeGenTypeText(app.getCodeGenType())).append("\n");
        markdown.append("- **导出时间**: ").append(LocalDateTime.now().format(DATE_TIME_FORMATTER)).append("\n");

        // 时间范围
        if (startTime != null || endTime != null) {
            markdown.append("- **对话时间范围**: ");
            if (startTime != null) {
                markdown.append(startTime.format(DATE_TIME_FORMATTER));
            } else {
                markdown.append("开始");
            }
            markdown.append(" ~ ");
            if (endTime != null) {
                markdown.append(endTime.format(DATE_TIME_FORMATTER));
            } else {
                markdown.append("结束");
            }
            markdown.append("\n");
        }

        // 应用初始化提示
        if (StrUtil.isNotBlank(app.getInitPrompt())) {
            markdown.append("- **应用初始化提示**: ").append(app.getInitPrompt()).append("\n");
        }

        markdown.append("\n---\n\n");
    }

    /**
     * 添加统计信息
     */
    private static void appendStatistics(StringBuilder markdown, List<ChatHistory> chatHistoryList) {
        if (chatHistoryList.isEmpty()) {
            markdown.append("## 📈 统计信息\n\n");
            markdown.append("暂无对话记录\n\n");
            markdown.append("---\n\n");
            return;
        }

        long userMessageCount = chatHistoryList.stream()
                .filter(chat -> ChatHistoryMessageTypeEnum.USER.getValue().equals(chat.getMessageType()))
                .count();
        long aiMessageCount = chatHistoryList.stream()
                .filter(chat -> ChatHistoryMessageTypeEnum.AI.getValue().equals(chat.getMessageType()))
                .count();

        // 计算对话轮数（以用户消息为准）
        long totalRounds = userMessageCount;

        markdown.append("## 📈 统计信息\n\n");
        markdown.append("- **总对话轮数**: ").append(totalRounds).append("\n");
        markdown.append("- **用户消息数**: ").append(userMessageCount).append("\n");
        markdown.append("- **AI回复数**: ").append(aiMessageCount).append("\n");
        markdown.append("- **总消息数**: ").append(chatHistoryList.size()).append("\n");

        // 时间跨度
        if (chatHistoryList.size() > 1) {
            LocalDateTime firstTime = chatHistoryList.get(0).getCreateTime();
            LocalDateTime lastTime = chatHistoryList.get(chatHistoryList.size() - 1).getCreateTime();
            markdown.append("- **对话时间跨度**: ")
                    .append(firstTime.format(DATE_TIME_FORMATTER))
                    .append(" ~ ")
                    .append(lastTime.format(DATE_TIME_FORMATTER))
                    .append("\n");
        }

        markdown.append("\n---\n\n");
    }

    /**
     * 添加对话记录
     */
    private static void appendChatHistory(StringBuilder markdown, List<ChatHistory> chatHistoryList) {
        if (chatHistoryList.isEmpty()) {
            markdown.append("## 💬 对话记录\n\n");
            markdown.append("暂无对话记录\n\n");
            return;
        }

        markdown.append("## 💬 对话记录\n\n");

        int conversationIndex = 1;
        ChatHistory previousChat = null;

        for (ChatHistory chat : chatHistoryList) {
            String messageType = chat.getMessageType();
            String message = chat.getMessage();
            LocalDateTime createTime = chat.getCreateTime();

            // 如果是用户消息，开始新的对话轮次
            if (ChatHistoryMessageTypeEnum.USER.getValue().equals(messageType)) {
                // 如果不是第一条消息，添加分隔线
                if (previousChat != null) {
                    markdown.append("\n---\n\n");
                }

                markdown.append("### 对话 #").append(conversationIndex).append(" - ")
                        .append(createTime.format(DATE_TIME_FORMATTER)).append("\n\n");

                markdown.append("**👤 用户**:\n");
                markdown.append(formatMessage(message)).append("\n\n");

                conversationIndex++;
            } else if (ChatHistoryMessageTypeEnum.AI.getValue().equals(messageType)) {
                markdown.append("**🤖 AI助手**:\n");
                markdown.append(formatMessage(message)).append("\n\n");
            }

            previousChat = chat;
        }
    }

    /**
     * 添加页脚
     */
    private static void appendFooter(StringBuilder markdown) {
        markdown.append("\n---\n\n");
        markdown.append("*本文档由 Jin AI Code 自动生成*\n");
        markdown.append("*导出时间: ").append(LocalDateTime.now().format(DATE_TIME_FORMATTER)).append("*\n");
    }

    /**
     * 格式化消息内容
     */
    private static String formatMessage(String message) {
        if (StrUtil.isBlank(message)) {
            return "*[空消息]*";
        }

        // 处理代码块，确保正确显示
        String formatted = message.trim();

        // 如果消息很长，可以考虑添加折叠
        if (formatted.length() > 2000) {
            return formatted.substring(0, 2000) + "\n\n*[消息过长，已截断]*";
        }

        return formatted;
    }

    /**
     * 获取代码生成类型的中文描述
     */
    private static String getCodeGenTypeText(String codeGenType) {
        if (StrUtil.isBlank(codeGenType)) {
            return "未知";
        }
        return switch (codeGenType) {
            case "html" -> "原生 HTML 模式";
            case "multi_file" -> "原生多文件模式";
            default -> codeGenType;
        };
    }
}
